home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 68K / Lib / img / imgpict.py < prev    next >
Text File  |  1996-05-20  |  3KB  |  111 lines

  1. """A minimal module to write Mac 24-bit RGB PICT files on any machine"""
  2. #
  3. # Macintosh PICT format reader/writer module
  4. #
  5. # Jack Jansen, CWI, 1995
  6. #
  7. import struct
  8. import imgformat
  9. import imgop
  10.  
  11. error = 'imgpict.error'
  12.  
  13. class reader:
  14.     def __init__(self, filename):
  15.     self._filename = filename
  16.     self.width = 0
  17.     self.height = 0
  18.     raise error, 'Reading PICT files not yet supported'
  19.  
  20.     def args(self):
  21.     return self.__dict__
  22.     
  23.     def read(self):
  24.     return ''
  25.  
  26.     def write(self, data):
  27.     raise error, 'Cannot write() to reader'
  28.  
  29. class writer:
  30.     """This object can write to a pict file. The width, height and format
  31.     attributes should be set before calling write()"""
  32.     
  33.     def __init__(self, filename):
  34.     self._filename = filename
  35.     self.format_choices = (imgformat.macrgb, )
  36.     self.format = imgformat.macrgb
  37.  
  38.     def args(self):
  39.     return self.__dict__
  40.     
  41.     def _get(self, attr):
  42.     try:
  43.         return getattr(self, attr)
  44.     except AttributeError:
  45.         raise error, "Required attribute '%s' missing"%attr
  46.  
  47.     def read(self):
  48.     raise error, 'Cannot read() from writer'
  49.  
  50.  
  51.     def write(self, data):
  52.     "write the actual data"
  53.     
  54.     w = self._get('width')
  55.     h = self._get('height')
  56.     fmt = self._get('format')
  57.     if fmt <> imgformat.macrgb:
  58.         raise error, 'Only macrgb currently supported'
  59.     if w*h*4 != len(data):
  60.         raise error, 'Incorrect datasize'
  61.     # Create the image structure. This is tricky due to possible alignment
  62.     imgstruct = struct.pack('hhhhh', 0x011, 0x02ff, 0x0c00, -2, 0)[:10]
  63.     imgstruct = imgstruct + struct.pack('llhhhh', 0x480000, 0x480000, 0, 0, h, w)
  64.     imgstruct = imgstruct + struct.pack('l', 0)
  65.     imgstruct = imgstruct + struct.pack('h', 0x9a)[:2]
  66.     imgstruct = imgstruct + struct.pack('l', 0xff)
  67.     imgstruct = imgstruct + struct.pack('hhhhhhh', 0x8000|(w*4),
  68.             0, 0, h, w, 0, 1)[:14]
  69.     imgstruct = imgstruct + struct.pack('lll', 0, 0x480000, 0x480000)
  70.     imgstruct = imgstruct + struct.pack('hhhh', 16, 32, 3, 8)
  71. ##    imgstruct = imgstruct + struct.pack('lll', 0, 0, 0)
  72. ##    imgstruct = imgstruct + struct.pack('l', 0x1000000)
  73. ##    imgstruct = imgstruct + struct.pack('hh', 0, 0)
  74. ##    imgstruct = imgstruct + struct.pack('hhhh', -1, 0, 0, 0)
  75.     imgstruct = imgstruct + struct.pack('lll', 0, 0xad892c, 0)  # ????
  76.     imgstruct = imgstruct + struct.pack('hhhh', 0, 0, h, w)
  77.     imgstruct = imgstruct + struct.pack('hhhh', 0, 0, h, w)
  78.     imgstruct = imgstruct + struct.pack('h', 0)[:2]
  79.     
  80.     length = len(imgstruct) + len(data) + 10 + 2
  81.     imghdr = struct.pack('hhhhh', length&0xffff, 0, 0, h, w)[:10]
  82.     imgtrailer = struct.pack('h', 0xff)[:2]
  83.     
  84.     fp = open(self._filename, 'w')
  85.     fp.write('\0'*512)
  86.     fp.write(imghdr)
  87.     fp.write(imgstruct)
  88.     fp.write(data)
  89.     fp.write(imgtrailer)
  90.     fp.close()
  91.     
  92.     try:
  93.         import macfs
  94.         macfs.FSSpec(self._filename).SetCreatorType('????', 'PICT')
  95.     except ImportError:
  96.         # We're probably not running on a mac
  97.         pass
  98.         
  99. def _test():
  100.     import imgppm
  101.     
  102.     r = imgppm.reader('in-rgb-t2b.ppm')
  103.     w = writer('out-mac.pict')
  104.     w.width, w.height = r.width, r.height
  105.     d = r.read()
  106.     d = imgop.shuffle(d, r.width, r.height, r.format, w.format)
  107.     w.write(d)
  108.  
  109. if __name__ == '__main__':
  110.     _test()    
  111.